﻿Public Class Form1
    Inherits System.Windows.Forms.Form
    Dim Descripcion(8) As String
    Dim Precio(8) As Double
    Dim array_CAT(100) As Integer
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' INICIALIZANDO DESCRIPCION DEL PRODUCTO
        Descripcion(0) = "SANSUNG 450Nb 0,28 mm dot pitch, " & _
            "resolución de 1024 x 768, 14' digital."
        Descripcion(1) = "PILOT WHEE Tres botones, salida PS/2, " & _
            "boton para Internet."
        Descripcion(2) = "BTC-AT 121 teclas en español, conector DIN."
        Descripcion(3) = "HP DESIGNJET 450C 600 dpi, A.0 color en 4 " & _
            "minutos, interfase paralela y red, alimentador manual, rollo opcional."
        Descripcion(4) = "IMAGE MOUSE PLUS Scanners para rollos y " & _
            "microfichas. Tipo escritorio, monocromático, captura menor a un " & _
            "segundo por frame, resolución optima a modo video digital "
        Descripcion(5) = "FLYGTH SIMULATOR Cuatro botones, " & _
            "compatible win 95/98."
        Descripcion(6) = "FIREBALL CX 13,0 GB, 9,5 ms. tiempo de " & _
            "acceso, 7200 rpm, interfase. ATA/4 Ultra DMA/66."
        Descripcion(7) = "ZIP DRIVE Iomega 100 MB Externo interfase USB."
        Descripcion(8) = "DLT8000 Drive int., 40/80 GB, kit, SCSI."
        ' INICIALIZANDO PRECIO DEL PRODUCTO
        Precio(0) = 127.9
        Precio(1) = 3.5
        Precio(2) = 12.0
        Precio(3) = 87.0
        Precio(4) = 128.0
        Precio(5) = 29.0
        Precio(6) = 110.5
        Precio(7) = 63.0
        Precio(8) = 65.0
        cboProducto.Text = cboProducto.Items.Item(0)
        btnAgregar.Enabled = False
    End Sub
    Private Sub cboProducto_SelectedIndexChanged(ByVal sender As System.Object, _
   ByVal e As System.EventArgs) Handles cboProducto.SelectedIndexChanged
        ' picImagen.Image = System.Drawing.Bitmap.FromFile("G:\vb.NET\" & _
        ' "Graficos\" & cboProducto.SelectedIndex.ToString & ".bmp")
        txtDescripcion.Text = Descripcion(cboProducto.SelectedIndex)
        txtPrecio.Text = Format(Precio(cboProducto.SelectedIndex), "0.00") 'Retorna la caneda en el formato-
        'requerido en este caso el double en el formato 0.00 con 2 decimales significativos
        txtCantidad.Focus()
        'Hace que el cursor se centre y parpadee en el objeto seleccionado en este caso el Textboox
    End Sub

    Private Sub txtCantidad_Validated(ByVal sender As Object, ByVal _
    e As System.EventArgs) Handles txtCantidad.Validated
        If txtCantidad.Text = "" Then txtCantidad.Focus() 'Si la cantidad es nula (espacio) que parpadee
    End Sub

    Private Sub txtCantidad_KeyPress(ByVal sender As Object, ByVal _
    e As System.Windows.Forms.KeyPressEventArgs) Handles txtCantidad.KeyPress
        e.Handled = solo_NUMERO(e.KeyChar.IsNumber(e.KeyChar), _
        e.KeyChar, txtCantidad)
        'Transfiere al metodo solo_Numero cada caracter presionado en el textbox txtcantidad para verificar
        'si se trata de un número o un alfanumerico
    End Sub

    Private Sub txtCantidad_TextChanged(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles txtCantidad.TextChanged
        If txtCantidad.Text <> "" Then
            btnAgregar.Enabled = True
        Else
            btnAgregar.Enabled = False
        End If
        'Si el txtcantidad es nulo que se quede deshabilitado el boton agregar caso contrario se habilita
    End Sub

    Private Sub btnAgregar_Click(ByVal sender As System.Object, ByVal _
    e As System.EventArgs) Handles btnAgregar.Click
        Dim TotaL As Double
        Dim IndicE, recupera_INDICE As Integer
        Dim producto_EXISTE As Boolean
        btnAgregar.Enabled = False
        If lstProducto.Items.Count = 0 Then
            lstProducto.Items.Add(cboProducto.Text)
            'Si la lista producto esta vacia agregar item del combobox y asi sucesivamente para precio
            'y cantidad
            lstPrecio.Items.Add(txtPrecio.Text)
            lstCantidad.Items.Add(txtCantidad.Text)
            lstSub.Items.Add((CStr(Val(txtCantidad.Text) * Val(txtPrecio.Text))))
            'CStr sirve para convertir una expresion a tipo string y Val para convertir una expresion
            'de tipo cadena a numerica
        End If
        For IndicE = 0 To lstProducto.Items.Count - 1
            If lstProducto.Items.Item(IndicE) = cboProducto.Text Then
                producto_EXISTE = True
                ' GUARDAMOS EL INDICE DEL PRODUCTO que fue marcado
                recupera_INDICE = IndicE
                ' REDIMENSIONAMOS EL  ARREGLO
                ReDim Preserve array_CAT(lstCantidad.Items.Count - 1)
                Dim valor As Integer
                ' GUARDAMOS LAS CANTIDADES EN UN ARREGLO
                For valor = 0 To lstCantidad.Items.Count - 1
                    array_CAT(valor) = lstCantidad.Items.Item(valor)
                Next
                Exit For
            End If
        Next IndicE
        ' VERIFICAMOS SI EL PRODUCTO EXISTE
        If producto_EXISTE Then
            ' RECUPERAMOS CANTIDADES DEL ARREGLO
            For IndicE = 0 To lstCantidad.Items.Count - 1
                If IndicE = recupera_INDICE Then
                    array_CAT(IndicE) = Val(txtCantidad.Text)
                Else
                    array_CAT(IndicE) = lstCantidad.Items.Item(IndicE)
                End If
            Next IndicE
            lstCantidad.Items.Clear() : lstSub.Items.Clear()
            Dim A As Integer
            ' REASIGNAMOS LOS ELEMENTOS A LA LISTA
            For A = 0 To IndicE - 1
                lstCantidad.Items.Add(array_CAT(A))
                lstSub.Items.Add(CStr(array_CAT(A) * Val(lstPrecio.Items.Item(A))))
            Next A
            ' SELECCIONAMOS EL PRODUCTO MODIFICADO
            lstSub.SelectedIndex = recupera_INDICE
            lstPrecio.SelectedIndex = recupera_INDICE
            lstCantidad.SelectedIndex = recupera_INDICE
            lstProducto.SelectedIndex = recupera_INDICE
        Else
            lstProducto.Items.Add(cboProducto.Text)
            lstPrecio.Items.Add(txtPrecio.Text)
            lstCantidad.Items.Add(txtCantidad.Text)
            lstSub.Items.Add((CStr(Val(txtCantidad.Text) * Val(txtPrecio.Text))))
            'Agregamos el del combobox
        End If
        ' CALCULAMOS EL IMPORTE Y EL TOTAL
        For IndicE = 0 To lstSub.Items.Count - 1
            TotaL = TotaL + Val(lstSub.Items.Item(IndicE))
            'Recorre tota la lista de subtotal para hallar un total que se le asigna a la variable total
        Next
        txtTotal.Text = CStr(Format(TotaL, "0.00"))
        txtIgv.Text = CStr(Format((0.19 * TotaL), "0.00"))
        txtNeto.Text = CStr(Format((1.19 * TotaL), "0.00"))
        'Formateo los numericos en 2 decimales y luego los convierto a cadena o String
        txtCantidad.Text = 0 : txtCantidad.Focus()
        lstProducto.Enabled = True : lstPrecio.Enabled = True
        lstCantidad.Enabled = True : lstSub.Enabled = True
    End Sub

    Private Sub lstProducto_SelectedIndexChanged(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles lstProducto.SelectedIndexChanged
        'Al hacer click sobre este item hace que los demas items que estan en la misca fila e igual caracteristica
        'se autoseleccionen 
        lstPrecio.SelectedIndex = lstProducto.SelectedIndex
        lstCantidad.SelectedIndex = lstProducto.SelectedIndex
        lstSub.SelectedIndex = lstProducto.SelectedIndex
        ' SELECCIONA EN EL COMO EL PRODUCTO ELEGIDO
        cboProducto.Text = lstProducto.Text : txtCantidad.Focus()
    End Sub

    Private Sub lstPrecio_SelectedIndexChanged(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles lstPrecio.SelectedIndexChanged
        'Al hacer click sobre este item hace que los demas items que estan en la misca fila e igual caracteristica
        'se autoseleccionen 
        lstProducto.SelectedIndex = lstPrecio.SelectedIndex
        lstCantidad.SelectedIndex = lstPrecio.SelectedIndex
        lstSub.SelectedIndex = lstPrecio.SelectedIndex
        ' SELECCIONA EN EL COMO EL PRODUCTO ELEGIDO
        cboProducto.Text = lstProducto.Items.Item(lstPrecio.SelectedIndex)
        txtCantidad.Focus()
    End Sub

    Private Sub lstCantidad_SelectedIndexChanged(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles lstCantidad.SelectedIndexChanged
        'Al hacer click sobre este item hace que los demas items que estan en la misca fila e igual caracteristica
        'se autoseleccionen 
        lstPrecio.SelectedIndex = lstCantidad.SelectedIndex
        lstProducto.SelectedIndex = lstCantidad.SelectedIndex
        lstSub.SelectedIndex = lstCantidad.SelectedIndex
        ' SELECCIONA EN EL COMO EL PRODUCTO ELEGIDO
        cboProducto.Text = lstProducto.Items.Item(lstCantidad.SelectedIndex)
        txtCantidad.Focus()
    End Sub

    Private Sub lstSub_SelectedIndexChanged(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles lstSub.SelectedIndexChanged
        'Al hacer click sobre este item hace que los demas items que estan en la misca fila e igual caracteristica
        'se autoseleccionen 
        lstPrecio.SelectedIndex = lstSub.SelectedIndex
        lstCantidad.SelectedIndex = lstSub.SelectedIndex
        lstProducto.SelectedIndex = lstSub.SelectedIndex
        ' SELECCIONA EN EL COMO EL PRODUCTO ELEGIDO
        cboProducto.Text = lstProducto.Items.Item(lstSub.SelectedIndex)
        txtCantidad.Focus()
    End Sub

    Public Function solo_NUMERO(ByVal cadena As Boolean, ByVal opcion As String, _
    ByVal tEXto As TextBox) As Boolean
        If Not cadena Then
            If Asc(opcion) = 8 Then
                solo_NUMERO = False
            Else
                solo_NUMERO = True
            End If
        End If
    End Function
    'Pregunta si no es cadena si se cumple esta condicion que el valor string de la variable opcion se convierta
    'a asscii y si el valor es 8 indica que es todo menos un numero
End Class